package com.zhiyou100.review.day017.myfile;

import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.Objects;

/**
 * @packageName: Test
 * @className: com.zhiyou100.review.day017.myFile
 * @Description: TODO 文件 测试
 * @author: yang
 * @date: 6/28/20
 */
public class Test {
    public static void main(String[] args) throws IOException {
        File file = new File("/Users/yang/Downloads/test/a.txt");

//        System.out.println(file.createNewFile());
        // 创建 a.txt 文件


        File file1 = new File("/Users/yang/Downloads/test/a");
//        System.out.println(file1.mkdir());
        // 创建 a 文件夹

        File file2 = new File("/Users/yang/Downloads/test/a/aa/aaa");
//        System.out.println(file2.mkdirs());
        // 创建 aa/aaa 文件夹

//        System.out.println(file.delete());
        // 删除文件 a.txt，删除成功

//        System.out.println(file1.delete());
        // 删除 a 文件夹 ， 失败，若文件夹不为空，删除失败

        File file3 = new File("src/main/resources/a.txt");
        System.out.println(file3.getAbsolutePath());
        // /Users/yang/Documents/javase_26/a.txt 获取绝对路径

        System.out.println(file3.getPath());
        // src/main/resources/a.txt 获取相对路径

        System.out.println(file3.getName());
        // a.txt 获取文件名

        System.out.println(file3.getParent());
        // src/main/resources 获取父目录

//        System.out.println(file.renameTo(new File(file.getParent()+"/b.txt")));
        // 文件重命名


        File file4 = new File("/Users/yang/Documents/javase_26");
        System.out.println(getLength(file4.getAbsolutePath()));
        // 177.4 MB    177393630/1000=177,393.63
    }

    /**
     * 练习题
     */

    /**
     * @Description: TODO 获取 文件或者文件夹的字节大小
     * @name: getLength
     * @param: [path]
     * @return: long
     * @date: 6/28/20 11:26
     * @author: yang
     */
    private static long getLength(String path) {
        // 1 封装对象
        File file = new File(path);
        if (!file.exists()) {
            // 如果不存在
            throw new RuntimeException(path + "该目录不存在!");
        }
        if (file.isFile()) {
            // 如果是文件
            return file.length();
        }
        // 如果是文件夹
        long length = 0;
        for (File file1 : Objects.requireNonNull(file.listFiles())) {
            // 遍历 直接 子文件、子文件夹
            length += getLength(file1.getAbsolutePath());
        }
        return length;

    }

    /**
     * @Description: TODO 拷贝文件时  只创建同名的文件  文件中的内容不管 只是一个空的文件 写一个方法static void copy(String pathName,String fileName)把fileName对应的文件/文件夹拷贝到pathName目录下
     * @name: copy
     * @param: [pathName, fileName]
     * @return: void
     * @date: 6/28/20 11:28
     * @author: yang
     */
    private static void copy(String pathName, String fileName) throws IOException {
        File targetDirectory = new File(pathName);
        // 目标目录

        File theOriginalDirectory = new File(fileName);
        // 原始目录

        if (!targetDirectory.exists()) {
            throw new RuntimeException(pathName + "不存在");
        }
        if (!theOriginalDirectory.exists()) {
            throw new RuntimeException(fileName + " 不存在");
        }
        if (!theOriginalDirectory.isDirectory()) {
            throw new RuntimeException(pathName + " 不是一个文件夹");
        }

        if (theOriginalDirectory.isFile()) {
            // 如果原始目录是一个 文件，直接在目标目录下创建同名文件
            new File(targetDirectory, theOriginalDirectory.getName()).createNewFile();
        }

        // 原始目录是一个 目录/文件夹
        File muDiFile = new File(targetDirectory, theOriginalDirectory.getName());
        muDiFile.mkdirs();
        for (File file : theOriginalDirectory.listFiles()) {
            copy(file.getAbsolutePath(), muDiFile.getAbsolutePath());
        }


    }


    /**
     * @Description: TODO  删除参数文件/参数文件夹
     * @name: delete
     * @param: [fileName]
     * @return: void
     * @date: 6/28/20 11:29
     * @author: yang
     */
    private static void delete(String fileName) {
        try {
            File file = new File(fileName);
            if (file.isDirectory()) {
                // 如果目录，判断有没有子目录和子文件
                File[] file1 = file.listFiles();
                // 把此目录下的所有文件提取,判断file1的长度
                String stringNull = "[]";
                if (stringNull.equals(Arrays.toString(file1))) {
                    //如果为空说明没有子文件和子文件夹，删除
                    file.delete();
                } else {
                    // 说明有子文件和子文件夹，递归删除
                    File[] file2 = new File[file1.length + 1];
                    // 创建一个新的长度+1的数组，用来放本身的目录
                    System.arraycopy(file1, 0, file2, 0, file1.length);
                    // 遍历赋值
                    file2[file2.length - 1] = file1[0].getParentFile();
                    // 把自身的目录，放入file2中
                    String temp = Arrays.toString(file2);
                    // 放此目录下的所有文件和目录
                    String temp1 = temp.substring(1, temp.length() - 1) + ", ";
                    // 去掉开头和结尾的' [ '
                    String[] temp2 = temp1.split(", ");
                    // 分割
                    for (String s :
                            temp2) {
                        // 递归删除
                        delete(s);
                    }
                }
            } else if (file.isFile()) {
                // 如果是文件删除
                file.delete();
            } else {
                System.out.println("啥也不是");
            }
        } catch (Exception e) {
            System.out.println("不是目录或文件");
        }
    }





}
